package br.edu.ufc.deti.broker.mapeamento.castor.utils;

import org.castor.mapping.BindingType;
import org.castor.mapping.MappingUnmarshaller;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.mapping.MappingLoader;
import org.exolab.castor.xml.ClassDescriptorResolver;
import org.exolab.castor.xml.ClassDescriptorResolverFactory;

/**
 * Essa classe � respons�vel por criar os ClassDescriptorResolver que ser�o
 * reutilizados nas opera��es de marshal e unMarshal com o castor. A utiliza��o
 * desse recurso visa a efici�ncia uma vez que n�o teremos que ler arquivos de
 * mapeamento toda vez que formos realizar uma opera��o.
 * 
 * @since March 15, 2008.
 * @author Marcelo Henrique.
 */
public class ClassDescriptorResolverUtil {

	/**
	 * Atributor que tem como finalidade implementar o Singleton.
	 */
	private static ClassDescriptorResolverUtil instance = new ClassDescriptorResolverUtil();
	
	/**
	 * Contrutor default que teve sua visibilidade
	 * modificada para que possa ser implementado o Singleton.
	 */
	private ClassDescriptorResolverUtil() {}
	
	/**
	 * M�todo que pega uma referencia para a objeto da classe.
	 * @return Uma referencia a um objeto dessa classe.
	 */
	public static ClassDescriptorResolverUtil getInstance() {
		return instance;
	}
	
	/**
	 * M�todo que cria o ClassDescriptorResolver a partir de um objeto de mapeamento ( Mapping )
	 * do castor.
	 * @param mapping Objeto de mapeamento do castor.
	 * @return Um objeto do tipo ClassDescriptorResolver do castor que poder� ser reutilizado.
	 * @throws MappingException.
	 */
	public ClassDescriptorResolver getClassDescriptorResolver( Mapping mapping ) throws MappingException {
		ClassDescriptorResolver classDescriptorResolver = ClassDescriptorResolverFactory.createClassDescriptorResolver( BindingType.XML );
		MappingUnmarshaller mappingUnmarshaller = new MappingUnmarshaller();
		MappingLoader mappingLoader = null;
		mappingLoader =	mappingUnmarshaller.getMappingLoader( mapping, BindingType.XML );
		classDescriptorResolver.setMappingLoader( mappingLoader );
		return classDescriptorResolver;
	}

}
